home *** CD-ROM | disk | FTP | other *** search
/ World of Video / World of Video.iso / gfxprograms / 3dprograms / t3dlib / source / freeworld.c < prev    next >
C/C++ Source or Header  |  1995-02-13  |  4KB  |  145 lines

  1. /* freeworld.c - free a TTDDDLIB WORLD * object
  2.  *             - written by John T. Grieggs - 12-3-91
  3.  *             - Thanks, John!  [--Glenn]
  4.  */
  5.  
  6. static char rcs_id[] = "$Id: freeworld.c,v 1.5 1993/01/30 12:55:49 glewis Exp $";
  7.  
  8. #include <stdio.h>
  9. #include "t3dlib.h"
  10. #ifdef __STDC__
  11. #include <stdlib.h>
  12. #include <strings.h>
  13. #include "freeworld_protos.h"
  14. #endif
  15.  
  16. #define myfree(x) {free((char *)x);x=NULL;}
  17.  
  18. /* free an OBJECT struct - recursive */
  19. OBJECT *free_object(object)
  20. OBJECT *object;
  21. {
  22.     FGRP *fgrp;
  23.     register int i;
  24.  
  25.     /* I follow the next chain, then the child chain.  Glenn? */
  26.     if (object->next)
  27.         object->next = free_object(object->next);
  28.     if (object->child)
  29.         object->child = free_object(object->child);
  30.  
  31.     /* free the easy parts */
  32.     if (object->extr)
  33.         myfree(object->extr);
  34.     if (object->user)
  35.         myfree(object->user);
  36.  
  37.     /* free the DESC */
  38.     if (object->desc) {
  39.         if (object->desc->shap)
  40.             myfree(object->desc->shap);
  41.         if (object->desc->posi)
  42.             myfree(object->desc->posi);
  43.         if (object->desc->axis)
  44.             myfree(object->desc->axis);
  45.         if (object->desc->size)
  46.             myfree(object->desc->size);
  47.         if (object->desc->pnts)
  48.             myfree(object->desc->pnts);
  49.         if (object->desc->colr)
  50.             myfree(object->desc->colr);
  51.         if (object->desc->refl)
  52.             myfree(object->desc->refl);
  53.         if (object->desc->tran)
  54.             myfree(object->desc->tran);
  55.         if (object->desc->spc1)
  56.             myfree(object->desc->spc1);
  57.         if (object->desc->edge)
  58.             myfree(object->desc->edge);
  59.         if (object->desc->face)
  60.             myfree(object->desc->face);
  61.         if (object->desc->clst)
  62.             myfree(object->desc->clst);
  63.         if (object->desc->rlst)
  64.             myfree(object->desc->rlst);
  65.         if (object->desc->tlst)
  66.             myfree(object->desc->tlst);
  67.         if (object->desc->tpar)
  68.             myfree(object->desc->tpar);
  69.         if (object->desc->surf)
  70.             myfree(object->desc->surf);
  71.         if (object->desc->mttr)
  72.             myfree(object->desc->mttr);
  73.         if (object->desc->spec)
  74.             myfree(object->desc->spec);
  75.         if (object->desc->prp0)
  76.             myfree(object->desc->prp0);
  77.         if (object->desc->prp1)
  78.             myfree(object->desc->prp1);
  79.         if (object->desc->ints)
  80.             myfree(object->desc->ints);
  81.         if (object->desc->int1)
  82.             myfree(object->desc->int1);
  83.         if (object->desc->stry)
  84.             myfree(object->desc->stry);
  85.         if (object->desc->eflg) {
  86.             if (object->desc->eflg->eflg)
  87.                 myfree(object->desc->eflg->eflg);
  88.             myfree(object->desc->eflg);
  89.         }
  90.         while (object->desc->fgrp) {
  91.             if (object->desc->fgrp->face)
  92.                 myfree(object->desc->fgrp->face);
  93.             fgrp = object->desc->fgrp;
  94.             object->desc->fgrp = object->desc->fgrp->next;
  95.             myfree(fgrp);
  96.         }
  97.         for (i=0; i<4; i++) {
  98.             if (!object->desc->txt2[i]) continue;
  99.             myfree(object->desc->txt2[i]);
  100.         }
  101.         myfree(object->desc);
  102.     }
  103.  
  104.     /* finally, free yourself */
  105.     free((char *)object);
  106.     return NULL;
  107. }
  108.  
  109. /* free the WORLD - always returns NULL, for "World = free_World(World);" */
  110. WORLD *free_World(World)
  111. WORLD *World;
  112. {
  113.     /* really have an object? */
  114.     if (!World)
  115.         return NULL;
  116.  
  117.     /* free the substructures */
  118.     if (World->info) {
  119.         if (World->info->obsv)
  120.             myfree(World->info->obsv);
  121.         if (World->info->ostr)
  122.             myfree(World->info->ostr);
  123.         if (World->info->fade)
  124.             myfree(World->info->fade);
  125.         if (World->info->skyc)
  126.             myfree(World->info->skyc);
  127.         if (World->info->ambi)
  128.             myfree(World->info->ambi);
  129.         if (World->info->glb0)
  130.             myfree(World->info->glb0);
  131.         myfree(World->info);
  132.     }
  133.     if (World->object)
  134.         World->object = free_object(World->object);
  135.     if (World->user)
  136.         myfree(World->user);
  137.  
  138.     /* I don't touch FILE *inp or OBJECT *curobj */
  139.  
  140.     /* free the World */
  141.     free((char *)World);
  142.     return NULL;
  143. }
  144.  
  145.